#ifndef SORTSELBASE_H
#define SORTSELBASE_H

#include "BaseMultSel.h"

class QSpinBox;
class QLabel;
class QGroupBox;
class Joueur;
class Sort;
class SortsEcoles;

/**
 * Cette classe permet de sélectionner une école de magie parmi la
 * liste complète des écoles disponibles.
 *
 * La classe gère automatiquement quelles sont les écoles accessible,
 * à partir de la Classe (ou des Classes) du Joueur.
 *
 * Fait appel à SelectionSort pour la sélection des sorts de chaque
 * école et chaque niveau. La liste des sorts est lue depuis le
 * fichier ListeSort.h
 *
 * @see SelectionSort
 * @author Johan "Solo" Luisier
 */
class SortSelBase : public BaseMultSel
{
  Q_OBJECT
 public:
  SortSelBase(Joueur *j);
  SortSelBase(const SortSelBase& sortSel);
  ~SortSelBase();
  StatusCode sortsSelectionnes(std::vector<unsigned>& vec);
 protected:
  /**
   * Choix du niveau de sorts.
   */
  QSpinBox *choisirNiveau;
  /**
   * Affichage du texte.
   */
  QLabel   *etiquette;
  /**
   * Cadre affiché autour du choix du niveau.
   */
  QGroupBox *nivGroupe;
  /**
   * Pointeur sur le PJ auquel on veut apprendre de nouveau sorts.
   */
  Joueur *joueur;
  unsigned
    ecoleCourante, /**< Garde en mémoire l'école choisie. */
    classeCourante, /**< Garde en mémoire la classe à laquelle on veut
		       ajouter des sorts. Attention, en cas de classes
		       jumelées on ne doir tester que la dernière! A
		       vérifier... */
    nbrSortsConnus; /**< Nombre de sorts déjà connus. */
 private:
  /**
   * Noms des écoles disponibles, en statique par soucis
   * d'optimisation, mais on pourrait peut-être lire ça depuis
   * ListeSorts.h...
   */
  static const std::vector<std::string> Ecoles;
  /**
   * Contient la liste des écoles auquelles le PJ a accès.
   */
  std::vector<bool> accesEcoles;
  unsigned preparerListeEcoles();
  const SortsEcoles* donnerListeSort(unsigned& nbr);
  /**
   * Contient les nouveaux sorts sélectionnés. Le premier indice
   * correspond à l'école, le deuxième au niveau.
   */
  std::vector< std::vector< std::vector< unsigned> > > sortsChoisis;
  /**
   * Pointeur sur le conteneur des sorts actuellement connus par le
   * PJ.
   */
  const std::vector< Sort >* sortsConnus;
  private slots:
  void selectionner();
};

#endif // SORTSELBASE_H
